package cn.lingyangwl.agile.system.service;

import cn.lingyangwl.agile.system.model.entity.SysMenu;
import cn.lingyangwl.agile.system.model.rqrs.menu.*;
import cn.lingyangwl.agile.model.module.auth.LoginUser;
import com.baomidou.mybatisplus.extension.service.IService;

import java.util.List;
import java.util.Set;

/**
 * 菜单数据 业务层
 * @author shenguangyang
 */
public interface SysMenuService extends IService<SysMenu> {

    /**
     * 根据菜单ID查询信息
     *
     * @param menuId 菜单ID
     * @return 菜单信息
     */
    SysMenu getMenuById(Long menuId);
    /**
     * 根据用户查询系统菜单列表
     *
     * @param req 菜单信息
     * @param userId 用户ID
     * @return 菜单列表
     */
    List<SysMenu> listMenuData(MenuListReq req, boolean isAdmin, Long userId);

    /**
     * 根据角色ID查询菜单树信息
     *
     * @param roleId 角色ID
     * @return 选中菜单列表
     */
    List<Long> listMenuByRoleId(Long roleId);

    /**
     * 根据用户ID查询权限
     *
     * @param userId 用户ID
     * @return 权限列表
     */
    Set<String> listMenuPermsByUserId(Long userId);

    /**
     * 根据用户ID查询菜单树信息
     * @param loginUser 登录用户
     * @param allSceneMenu 查询场景下的全部菜单, 只有当租户是一个管理某个场景时, 才会生效, 非管理场景的租户并不会生效
     * @return 菜单列表
     */
    List<SysMenu> listLoginUserMenu(LoginUser loginUser, Boolean allSceneMenu);
    
    /**
     * 根据用户ID查询菜单树信息
     * @param loginUser 登录用户
     * @param sceneId 场景ID
     * @return 菜单列表
     */
    List<SysMenu> listLoginUserMenu(LoginUser loginUser, Long sceneId, Boolean allSceneMenu);

    /**
     * 获取用户的全部菜单
     * @param isAdmin 用户id
     * @param sceneId 场景ID
     */
    List<SysMenu> listAllMenuByRoleIds(boolean isAdmin, List<Long> roleIds, Long sceneId);

    /**
     * 获取菜单
     */
    List<SysMenu> listMenu();

    /**
     * 修改保存菜单信息
     *
     * @param menuData 菜单信息
     * @return 结果
     */
    boolean updateMenu(SysMenu menuData);

    /**
     * 构建菜单树
     */
    List<MenuTreeResp> listMenuTree(MenuListReq req, Long userId, Long parentId);

    /**
     * 保存菜单
     * @param req 菜单数据
     */
    boolean saveMenu(SysMenu req);

    /**
     * 删除菜单管理信息
     *
     * @param menuId 菜单ID
     * @return 结果
     */
    boolean deleteMenuById(Long menuId);

    /**
     * 校验菜单名是否唯一
     * @param menuName 菜单名
     * @return 结果
     */
    boolean checkMenuNameUnique(String menuName);

    /**
     * 复制菜单, 复制规则如下 <br/>
     * 对于多级菜单, 不管你复制的菜单是哪一级菜单, 从根出发经过nodeId = id节点都被拷贝
     *
     */
    void copyMenu(MenuCopyReq req);

    /**
     * 查询权限树
     */
    MenuPermissionTreeResp listPermissionTree(Long sceneId, boolean allSceneMenu);

    /**
     * 构建前端路由所需要的菜单
     */
    List<VueRouterResp> buildVueRouters(List<SysMenu> menus);

    /**
     * 只保存菜单树中叶子节点以及所有btn类型菜单
     * @param menuIds 菜单id
     * @return 过滤后的结果
     */
    Set<Long> reserveTreeBtnAndLeaf(List<Long> menuIds);
}
